package com.tbit.main.service;


import com.tbit.common.entity.vo.MainLogAuditVo;
import com.tbit.main.pojo.*;

import java.text.ParseException;
import java.util.List;
import java.util.Map;

/**
 * 调度记录
 *
 * @author Leon
 * 2019年11月12日 下午4:45:49
 */
public interface DispatchLogService {

    /**
     * 添加
     *
     * @param dispatchLog
     */
    public Integer insert(DispatchLog dispatchLog);

    /**
     * 按时间分组统计
     *
     * @param agentId
     * @param userType
     * @param usermainId
     * @param state
     * @param startTime
     * @param endTime
     * @return
     */
    public List<DispatchLogSta> groupByTime(Integer agentId, Integer userType, Integer usermainId, Integer state,
                                            String startTime, String endTime, Integer isValid, List<Integer> regionId, Integer machineType);

    /**
     * 根据时间查询
     *
     * @param accountId
     * @param userMainId
     * @param state
     * @param startTime
     * @param endTime
     * @param userCode
     * @return
     */
    public List<DispatchLog> getByTime(Integer accountId, Integer userMainId, Integer state,
                                       String startTime, String endTime, String userCode, Integer isValid, List<Integer> regionId, Integer machineType);

    /**
     * 调度
     *
     * @param accountUser
     * @param machineNO
     * @param parkPointId
     * @return
     */
    DispatchLog dispatch(AccountUser accountUser, String machineNO, Integer parkPointId, Double lon, Double lat, Integer mapType) throws Exception;

    /**
     * 调度费用统计数据
     *
     * @param accountId
     * @param startTime
     * @param endTime
     * @return
     */
    DispatchPaySta staByTime(Integer accountId, String startTime, String endTime);

    /**
     * 调度费用统计数据
     *
     * @param regionId
     * @param startTime
     * @param endTime
     * @return
     */
    DispatchPaySta staRegionIdByTime(Integer regionId, String startTime, String endTime);

    /**
     * 根据运营区域和时间统计所有
     *
     * @param accountId
     * @param state
     * @param startTime
     * @param endTime
     * @param isValid
     * @return
     */
    Integer getByAccountIdTime(Integer accountId, Integer state, String startTime, String endTime, Integer isValid);

    /**
     * 根据分区和时间统计所有
     *
     * @param regionId
     * @param state
     * @param startTime
     * @param endTime
     * @param isValid
     * @return
     */
    Integer getByRegionIdTime(Integer regionId, Integer state, String startTime, String endTime, Integer isValid);

    /**
     * 根据运营区域和时间分组
     *
     * @param accountId
     * @param statDate
     * @param endDate
     * @return
     */
    List<Map<String, Object>> getGroupByDay(Integer accountId, String statDate, String endDate);

    /**
     * 批量调度
     *
     * @param accountUser
     * @param userCode
     * @param parkPointId
     * @return
     */
    void dispatchBatch(AccountUser accountUser, List<String> userCode, Integer parkPointId, Double lon, Double lat, Integer mapType) throws Exception;

    /**
     * 调度上锁
     *
     * @param machine 车辆
     * @param remark  备注
     */
    void dispatchLock(Machine machine, String remark);

    /**
     * 结束工单
     * @param machineId 设备 Id
     * @param dispatchLogId 调度记录编号
     * @param isValid 是否有效
     * @param state 工单状态
     * @param accountUser 运维人员
     * @param remark 备注
     */
    String endWork(Integer machineId, Integer dispatchLogId, Integer isValid, Integer state, AccountUser accountUser, String remark);

    /**
     * 根据id查询
     *
     * @param dispatchLogId
     * @return
     */
    DispatchLog getById(Integer dispatchLogId);

    /**
     * 根据ids查询
     *
     * @param dispatchLogIds
     * @return
     */
    List<DispatchLog> getByIds(List<Integer> dispatchLogIds);

    /**
     * 根据时间查询
     *
     * @param machineId
     * @param time
     * @return
     */
    List<DispatchLog> getByMachineIdTime(Integer machineId, String time, Integer isValid);

    /**
     * 修改调度记录
     *
     * @param dispatchId
     * @param isValid
     */
    void audit(Integer dispatchId, Integer isValid, String remark, String auditTime);

    /**
     * 修改调度记录
     */
    void update(MainLogAuditVo vo);

    /**
     * 判断是否符合条件
     *
     * @param userCode
     * @return
     */
    Integer workOrder(String userCode) throws ParseException;

    /**
     * 根据调度编号列表查询
     * @param dispatchLogIdList 编号列表
     * @return 调度列表
     */
    List<DispatchLog> getDispatchLogIds(List<Integer> dispatchLogIdList);

    /**
     * 更新首次产生订单时间和有效订单数
     * @param machineId 车辆 id
     */
    void updateFistOrderTimeAndAfterValidOrder(Integer machineId);

    void delCache(String userCode);

    void batchDelCache(List<String> userCodes);
}
